//
//  ZDNetManager.h
//  ZDCommonlyProject
//
//  Created by Darker on 2017/2/5.
//  Copyright © 2017年 Darker. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#define ZDNetManagerShare [ZDNetManager sharedZDNetManager]

/*! 使用枚举NS_ENUM:区别可判断编译器是否支持新式枚举,支持就使用新的,否则使用旧的 */
typedef NS_ENUM(NSUInteger, ZDNetworkStatus)
{
    /*! 未知网络 */
    ZDNetworkStatusUnknown           = 0,
    /*! 没有网络 */
    ZDNetworkStatusNotReachable,
    /*! 手机自带网络 */
    ZDNetworkStatusReachableViaWWAN,
    /*! wifi */
    ZDNetworkStatusReachableViaWiFi
};

/*！定义请求类型的枚举 */
typedef NS_ENUM(NSUInteger, ZDHttpRequestType)
{
    /*! get请求 */
    ZDHttpRequestTypeGet = 0,
    /*! post请求 */
    ZDHttpRequestTypePost,
    /*! put请求 */
    ZDHttpRequestTypePut,
    /*! delete请求 */
    ZDHttpRequestTypeDelete
    
};

/*! 定义请求成功的block */
typedef void( ^ ZDResponseSuccess)(id response);
/*! 定义请求失败的block */
typedef void( ^ ZDResponseFail)(NSError *error);

/*! 定义上传进度block */
typedef void( ^ ZDUploadProgress)(int64_t bytesProgress,
int64_t totalBytesProgress);
/*! 定义下载进度block */
typedef void( ^ ZDDownloadProgress)(int64_t bytesProgress,
int64_t totalBytesProgress);

/*!
 *  方便管理请求任务。执行取消，暂停，继续等任务.
 *  - (void)cancel，取消任务
 *  - (void)suspend，暂停任务
 *  - (void)resume，继续任务
 */
typedef NSURLSessionTask ZDURLSessionTask;



@interface ZDNetManager : NSObject

/*! 获取当前网络状态 */
@property (nonatomic, assign) ZDNetworkStatus   netWorkStatus;

/*!
 *  获得全局唯一的网络请求实例单例方法
 *
 *  @return 网络请求类ZDNetManager单例
 */
+ (instancetype)sharedZDNetManager;

/*!
 *  开启网络监测
 */
+ (void)zd_startNetWorkMonitoring;

/*!
 *  网络请求方法,block回调
 *
 *  @param type         get / post
 *  @param urlString    请求的地址
 *  @param parameters    请求的参数
 *  @param successBlock 请求成功的回调
 *  @param failureBlock 请求失败的回调
 *  @param progress 进度
 */
+ (ZDURLSessionTask *)zd_requestWithType:(ZDHttpRequestType)type
                               UrlString:(NSString *)urlString
                              Parameters:(NSDictionary *)parameters
                            SuccessBlock:(ZDResponseSuccess)successBlock
                            FailureBlock:(ZDResponseFail)failureBlock
                                progress:(ZDDownloadProgress)progress;

/*!
 *  上传图片(多图)
 *
 *  @param parameters   上传图片预留参数---视具体情况而定 可移除
 *  @param imageArray   上传的图片数组
 *  @param fileName     上传的图片数组fileName
 *  @param urlString    上传的url
 *  @param successBlock 上传成功的回调
 *  @param failureBlock 上传失败的回调
 *  @param progress     上传进度
 */
+ (ZDURLSessionTask *)zd_uploadImageWithUrlString:(NSString *)urlString
                                       parameters:(NSDictionary *)parameters
                                       ImageArray:(NSArray *)imageArray
                                         FileName:(NSString *)fileName
                                     SuccessBlock:(ZDResponseSuccess)successBlock
                                      FailurBlock:(ZDResponseFail)failureBlock
                                   UpLoadProgress:(ZDUploadProgress)progress;
//新增方法
//name 表单名
+ (ZDURLSessionTask * )multipartUploadWithURL:(NSString *)URL
                                   parameters:(NSDictionary *)parameters
                                       images:(NSArray<UIImage *> *)images
                                        name:(NSString *)name
                                    fileNames:(NSArray  *)fileNames
                                     progress:(ZDUploadProgress)progress
                                      success:(ZDResponseSuccess)successBlock
                                      failure:(ZDResponseFail)failureBlock;




/*!
 *  视频上传
 *
 *  @param parameters   上传视频预留参数---视具体情况而定 可移除
 *  @param videoPath    上传视频的本地沙河路径
 *  @param urlString     上传的url
 *  @param successBlock 成功的回调
 *  @param failureBlock 失败的回调
 *  @param progress     上传的进度
 */
+ (void)zd_uploadVideoWithUrlString:(NSString *)urlString
                         parameters:(NSDictionary *)parameters
                          VideoPath:(NSString *)videoPath
                       SuccessBlock:(ZDResponseSuccess)successBlock
                       FailureBlock:(ZDResponseFail)failureBlock
                     UploadProgress:(ZDUploadProgress)progress;

/*!
 *  文件下载
 *
 *  @param parameters   文件下载预留参数---视具体情况而定 可移除
 *  @param savePath     下载文件保存路径
 *  @param urlString        请求的url
 *  @param successBlock 下载文件成功的回调
 *  @param failureBlock 下载文件失败的回调
 *  @param progress     下载文件的进度显示
 */
+ (ZDURLSessionTask *)zd_downLoadFileWithUrlString:(NSString *)urlString
                                        parameters:(NSDictionary *)parameters
                                          SavaPath:(NSString *)savePath
                                      SuccessBlock:(ZDResponseSuccess)successBlock
                                      FailureBlock:(ZDResponseFail)failureBlock
                                  DownLoadProgress:(ZDDownloadProgress)progress;


@end
